#include <iostream>       // 包含标准输入输出流  
#include <random>         // 包含随机数生成库  
#include <sstream>        // 包含字符串流库  
#include <iomanip>        // 包含输入输出格式控制库  
#include <atomic>         // 包含原子操作库，用于线程安全地递增序列号  
  
// 生成一个模拟的UUID字符串  9ab8a017-3def-dc22-0000-000000000001
static std::string uuid()  
{  
    std::random_device rd;           // 非确定性随机数生成器  
    std::mt19937_64 generator(rd()); // 基于Mersenne Twister算法的64位随机数生成器  
    std::uniform_int_distribution<int> distribution(0,255); // 均匀分布的随机数，范围从0到255  
    std::stringstream ss;            // 字符串流，用于构建UUID字符串  
  
    // 生成UUID的前半部分（不含版本和变体）  9ab8a017-3def-dc22
    for(int i = 0; i < 8; i++)  
    {  
        ss << std::setw(2) << std::setfill('0') << std::hex << distribution(generator); // 生成并格式化一个两位的十六进制数  
        if(i == 3 || i == 5 || i == 7) // 在适当的位置插入短横线  
        {  
            ss << "-";  
        }  
    }  
  
    // 使用原子操作生成并添加序列号（模拟UUID的后半部分）  
    static std::atomic<size_t> seq(1); // 原子变量，用于生成序列号，从1开始  
    size_t num = seq.fetch_add(1);     // 原子地递增序列号，并返回递增前的值  
  
    // 将序列号转换为十六进制字符串，并添加到UUID字符串的末尾  -0000-000000000001
    for(int i = 7; i >= 0; i--)  
    {  
        ss << std::setw(2) << std::setfill('0') << std::hex << ((num >> (i * 8)) & 0xff); // 提取序列号的一个字节，并格式化为两位的十六进制数  
        if(i == 6) ss << "-"; // 在序列号和前半部分之间插入短横线  
    }  
  
    return ss.str(); // 返回构建好的UUID字符串  
}  
  
int main()  
{  
    for(int i = 0; i < 20; i++)  
    {  
        std::cout << uuid() << std::endl; // 打印20个模拟的UUID字符串  
    }  
    return 0;  
}